/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Rozvrh;

import InformacnaStruktura.CasBezDatumu;
import InformacnaStruktura.TypSalda;
import org.w3c.dom.Element;

/**
 *  Trieda, ktorá obsahuje a pracuje s temporálnými informáciami o zamestnancoch, 
 * teda informáciami, ktoré platia len na daný mesiac. Obsahuje počty odpracovaných-neodpracovaných 
 * hodín zamestnancov za minulé obdobie, tento mesiac a budúce obdobie.
 * @author MartinaHlinková
 */
public class NastavenieZamestnancaMesiac {
    private InformacnaStruktura.TypSalda typSaldaMinulost;
    private InformacnaStruktura.TypSalda typSaldaBuducnost;
    private InformacnaStruktura.CasBezDatumu prenosMinulost;
    private InformacnaStruktura.CasBezDatumu prenosBuducnost;
    private InformacnaStruktura.CasBezDatumu tentoMesiac;
    
    /**
     * Konštruktor objektov triedy NastavenieZamestnancaMesiac, ktorý nastaví všetky vlastnosti na časy 0:00
     */
    public NastavenieZamestnancaMesiac(){
        this.typSaldaMinulost = InformacnaStruktura.TypSalda.NADPOCETNE;
        this.typSaldaBuducnost = InformacnaStruktura.TypSalda.NADPOCETNE;
        this.prenosBuducnost = new InformacnaStruktura.CasBezDatumu(0,0);
        this.prenosMinulost = new InformacnaStruktura.CasBezDatumu(0,0);
        this.tentoMesiac = new InformacnaStruktura.CasBezDatumu(0,0);
    }
    /**
     * Konštruktor objektov triedy NastavenieZamestnancaMesiac, ktorý nastaví odpracované-neodpracované
     * hodiny v minulom období podľa atribátov a ostatné na časy 0:00.
     * @param minulost  počet hodín na prenos z minulého obdobia
     * @param typSalda označenie odpracovaných alebo neodpracovaných hodín
     */
    public NastavenieZamestnancaMesiac(InformacnaStruktura.CasBezDatumu minulost,InformacnaStruktura.TypSalda typSalda){
        this.prenosBuducnost = new InformacnaStruktura.CasBezDatumu(0,0);
        this.typSaldaBuducnost = InformacnaStruktura.TypSalda.NADPOCETNE;
        this.prenosMinulost = minulost;
        this.typSaldaMinulost = typSalda;
         this.tentoMesiac = new InformacnaStruktura.CasBezDatumu(0,0);
    }
    /**
     * Metóda, ktorá načíta nastavenie jedného zamestnanca v mesiaci z elementu xml.
     * @param zamestnanec   element zamestnanca xml
     * @return nastavenie daného zamestnanca
     */
   public static NastavenieZamestnancaMesiac nacitajNastavenieZamestnanca(Element zamestnanec){
       if(zamestnanec == null)return null;
       NastavenieZamestnancaMesiac navrat = new NastavenieZamestnancaMesiac();
       try{
           String min = zamestnanec.getAttribute("minulost");
           String bud = zamestnanec.getAttribute("buducnost");
           if(min == null || bud == null)return null;
           
           int minulost = Integer.parseInt(min);
           if(minulost < 0){
               navrat.setTypSaldaMinulost(TypSalda.NEDOPOCETNE);
               minulost *= (-1);
           }
           int minHodiny = minulost/60;
           int minMinuty = minulost%60;
           InformacnaStruktura.CasBezDatumu casMinulost = new InformacnaStruktura.CasBezDatumu(minHodiny,minMinuty);
           navrat.setPrenosMinulost(casMinulost);
           
           int buducnost = Integer.parseInt(bud);
           if(buducnost < 0){
               navrat.setTypSaldaBuducnost(TypSalda.NEDOPOCETNE);
               buducnost *= (-1);
           }
           int budHodiny = buducnost/60;
           int budMinuty = buducnost%60;
           InformacnaStruktura.CasBezDatumu casBuducnost = new InformacnaStruktura.CasBezDatumu(budHodiny,budMinuty);
           navrat.setTentoMesiac(new InformacnaStruktura.CasBezDatumu(0,0));
           navrat.setPrenosBuducnost(casBuducnost);
       
       }catch (Exception e) {
            e.printStackTrace();
            return null;
        }
       
       
       return navrat;
   }
/**
 * Metóda, ktorá vráti počet odpracovaných hodín pre rozvrh mesiaca.
 * @return počet odpracovaných hodín pre rozvrh mesiaca
 */
    public CasBezDatumu getTentoMesiac() {
        return tentoMesiac;
    }

    /**
     * Metóda, ktorá nastaví počet odpracovaných hodín rozvrhu mesiaca.
     * @param tentoMesiac počet odpracovaných hodín rozvrhu mesiaca
     */
    public void setTentoMesiac(CasBezDatumu tentoMesiac) {
        this.tentoMesiac = tentoMesiac;
    }

    /**
     * Metóda, ktorá nastaví prenos hodín do ďalšieho obdobia.
     * @param prenosBuducnost prenos hodín do ďalšieho obdobia
     */
    public void setPrenosBuducnost(CasBezDatumu prenosBuducnost) {
        this.prenosBuducnost = prenosBuducnost;
    }

    /**
     * Metóda, ktorá nastaví prenos hodín z minulého obdobia.
     * @param prenosMinulost prenos hodín z minulého obdobia
     */
    public void setPrenosMinulost(CasBezDatumu prenosMinulost) {
        this.prenosMinulost = prenosMinulost;
    }

    /**
     * Metóda, ktorá nastaví typ prenosu hodín do budúceho obdobia. (Odpracované-neodpracované)
     * @param typSaldaBuducnost typ prenosu hodín do budúceho obdobia
     */
    public void setTypSaldaBuducnost(TypSalda typSaldaBuducnost) {
        this.typSaldaBuducnost = typSaldaBuducnost;
    }

    /**
     * Metóda, ktorá nastaví typ prenosu hodín z minulého obdobia. (Odpracované-neodpracované)
     * @param typSaldaMinulost typ prenosu hodín z minulého obdobia
     */
    public void setTypSaldaMinulost(TypSalda typSaldaMinulost) {
        this.typSaldaMinulost = typSaldaMinulost;
    }
    
    /**
     * Metóda, ktorá vráti počet hodín, ktoré sa prenášajú z minulého obdobia.
     * @return počet hodín, ktoré sa prenášajú z minulého obdobia
     */
    public InformacnaStruktura.CasBezDatumu getPrenostMinulehoObdobia(){
        return this.prenosMinulost;
    }
    /**
     * Metóda, ktorá vráti počet hodín, ktoré sa prenášajú do budúceho obdobia.
     * @return počet hodín, ktoré sa prenášajú do budúceho obdobia
     */
    public InformacnaStruktura.CasBezDatumu getPrenostBuducehoObdobia(){
        return this.prenosBuducnost;
    }
    
    /**
     * Metóda, ktorá vráti typ prenášaných hodín z minulosti. (odpracované - neodpracované)
     * @return typ prenášaných hodín z minulosti
     */
    public InformacnaStruktura.TypSalda getTypSaldaMinulost(){
        return this.typSaldaMinulost;
    }
    
     /**
     * Metóda, ktorá vráti typ prenášaných hodín do budúcnosti. (odpracované - neodpracované)
     * @return typ prenášaných hodín do budúcnosti
     */
    public InformacnaStruktura.TypSalda getTypSaldaBuducnost(){
        return this.typSaldaBuducnost;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 47 * hash + (this.prenosMinulost != null ? this.prenosMinulost.hashCode() : 0);
        hash = 47 * hash + (this.prenosBuducnost != null ? this.prenosBuducnost.hashCode() : 0);
        return hash;
    }
    
    @Override
    public boolean equals(Object o){
        if(o == this){
            return true;
        }
        if(o instanceof NastavenieZamestnancaMesiac == false){
            return false;
        }
        boolean rovnake = (this.getPrenostMinulehoObdobia() == ((NastavenieZamestnancaMesiac) o).getPrenostMinulehoObdobia());
        if(rovnake == true){
            rovnake = (this.getPrenostBuducehoObdobia() == ((NastavenieZamestnancaMesiac) o).getPrenostBuducehoObdobia());
        }else return false;
        return rovnake;
    }
}
